require "Reloading/ISReloadable"

ISReloadableMagazine = ISReloadable:derive("ISReloadableMagazine");

--************************************************************************--
--** ISReloadableMagazine:initialise
--**
--************************************************************************--
function ISReloadableMagazine:initialise()

end

--************************************************************************--
--** ISReloadableMagazine:new
--**
--************************************************************************--
function ISReloadableMagazine:new()
	local o = {}
	--o.data = {}
	o = ISReloadable:new();
    setmetatable(o, self);
    self.__index = self;
	return o;
end

--************************************************************************--
--** ISReloadableMagazine:canReload
--**
--** Whether the character attempting to reload has the necessary
--** prerequisites to perform the reload action. Called prior to
--** the timed action and not to be confused with isReloadValid
--**
--************************************************************************--
function ISReloadableMagazine:canReload(chr)
	if(self.currentCapacity < self.maxCapacity
	and chr:getInventory():FindAndReturn(self.ammoType) ~= nil) then
		return true;
	end
	return false;
end

--************************************************************************--
--** ISReloadableMagazine:isReloadValid
--**
--** Function for the TimedAction that determines whether the reload
--** action is still valid. If the player does something that should
--** interrupt the action, this should return false
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param difficulty - the difficulty level
--**
--** @return true if the action may continue to be performed
--**
--************************************************************************--
function ISReloadableMagazine:isReloadValid(char, square, difficulty)
	if(self.currentCapacity < self.maxCapacity
		and char:getInventory():FindAndReturn(self.ammoType) ~= nil) then
			return true;
	end
	self.reloadInProgress = false;
	return false;
end

--************************************************************************--
--** ISReloadableMagazine:reloadStart
--**
--** Function that should be performed upon the start of the timed action
--** Considers the difficulty and performs the corresponding difficulty
--** reload action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param difficulty - the difficulty level
--**
--************************************************************************--
function ISReloadableMagazine:reloadStart(char, square, difficulty)
	self.reloadInProgress = true;
end

--************************************************************************--
--** ISShotgunWeapon:reloadPerform
--**
--** Function that should be performed upon successful completion of the
--** timed action. Considers the difficulty and performs the corresponding
--** reload action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param difficulty - the difficulty level
--**
--************************************************************************--
function ISReloadableMagazine:reloadPerform(char, square, difficulty, magazine)
--	getSoundManager():PlayWorldSound(self.insertSound, char:getSquare(), 0, 10, 1.0, false);
    char:playSound(self.insertSound);
	self.currentCapacity = self.currentCapacity + 1;
	-- remove the necessary ammo
	char:getInventory():RemoveOneOf(self.ammoType);
	self.reloadInProgress = false;
	self:syncReloadableToItem(magazine);
	if(self.currentCapacity == self.maxCapacity) then
		return false;
	end
	return true;
end

--************************************************************************--
--** ISReloadableMagazine:rackingStart
--**
--** Function that should be performed upon the start of the timed action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--**
--************************************************************************--
function ISReloadableMagazine:rackingStart(char, square, weapon)
--    getSoundManager():PlayWorldSound(self.rackSound, char:getSquare(), 0, 10, 1.0, false);
    char:playSound(self.rackSound);
end

--************************************************************************--
--** ISReloadableMagazine:rackingPerform
--**
--** Function that should be performed upon successful completion of the
--** timed action
--**
--** @param char - the character performing the action. Must not be nil
--** @param square - not used
--** @param weapon - the item being reloaded
--**
--************************************************************************--
function ISReloadableMagazine:rackingPerform(char, square, weapon)
    if(self.currentCapacity > 0) then
        self.currentCapacity = self.currentCapacity - 1;
        char:getInventory():AddItem('Base.'..self.ammoType);
        ISInventoryPage.dirtyUI();
	    self:syncReloadableToItem(weapon);
	end
end

--************************************************************************--
--** ISReloadableMagazine:getRackTime
--**
--** Returns the time take to perform the reload action
--**
--************************************************************************--
function ISReloadableMagazine:getRackTime()
	return self.rackTime;
end

--************************************************************************--
--** ISReloadableMagazine:syncItemToReloadable
--**
--** Function that copies details from an Item's modData to the instance
--** of this ISReloadableMagazine
--**
--** @param item - the item from which the reloadable information
--** should be retrieved
--**
--************************************************************************--
function ISReloadableMagazine:syncItemToReloadable(item)
	ISReloadable.syncItemToReloadable(self, item);
	local modData = item:getModData();
	self.clipType = modData.clipType;
end

--************************************************************************--
--** ISReloadableMagazine:syncReloadableToItem
--**
--** Function that copies details from the instance of this 
--** ISReloadableMagazine to an Item's modData
--**
--** @param item - the item to which the reloadable information
--** should be copied
--**
--************************************************************************--
function ISReloadableMagazine:syncReloadableToItem(item)
	ISReloadable.syncReloadableToItem(self, item);
	local modData = item:getModData();
	modData.clipType = self.clipType;
end

--************************************************************************--
--** ISReloadableMagazine:setupReloadable
--**
--** Function that initialises all the required modData on an item.
--**
--** @param item - the item to setup
--** @param v - the lua table containing the key value pairs to attach
--** to the modData
--************************************************************************--
function ISReloadableMagazine:setupReloadable(item, v)
	ISReloadable.setupReloadable(self, item, v);
	local modData = item:getModData();
	modData.clipType = v.clipType;
end
